//package jmm.dcl;
//
//import lombok.extern.slf4j.Slf4j;
//
//import java.util.Random;
//import java.util.concurrent.CountDownLatch;
//import java.util.concurrent.atomic.AtomicInteger;
//
//@Slf4j
//public class DclErrDemo {
//
//    public static volatile AtomicInteger num = new AtomicInteger();
//
//    public static void main(String[] args) throws Exception {
//        for ( ; ; ){
//            CountDownLatch latch = new CountDownLatch(1);
//            CountDownLatch end = new CountDownLatch(100);
//            for (int i = 0 ; i < 100 ; i++) {
//                Thread t1 = new Thread(() -> {
//                    try{
//                        int n = num.incrementAndGet();
//                        log.info("线程名称：{},n:{}",Thread.currentThread().getName(),n);
//                        // 创建100个线程,同时在这里等着
//                        latch.await();
//                        // 当100个线程创建完之后，同时放开，同时创建对象
//                        SingleObj singleObj = SingleObj.getInstance();
//                        // 当singleObj不为null，但是singleObj.i为0的时候，说明实例化的对象已经赋值给引用对象，但是构造方法还没有执行
//                        if (singleObj.i == 0) {
//                            System.err.println("对象第" + n + "次时未初始化完成,i==0");
//                            System.exit(0);
//                        }
//                        // 当线程等到到100个的时候，end.await();会放行，同时会调用reset()重置单例
//                        end.countDown();
//                    }
//                    catch (Exception e) {
//                        e.printStackTrace();
//                    }
//                },"线程"+i);
//                t1.start();
//            }
//            // 100个线程创建完之后，调用countDown() 放行latch.await();
//            latch.countDown();
//            // 等待100线程的创建
//            end.await();
//            // 重置
//            SingleObj.reset();
//        }
//    }
//
//    static class SingleObj {
//        private int i;
//        private static   SingleObj single;
//
//        private SingleObj(){
//            //i = 1;
//            i = 1+ new Random().nextInt(100);
//        }
//        public static SingleObj getInstance() {
//            if (null == single) {
//                synchronized (SingleObj.class) {
//                    if (null == single){
//                        single = new SingleObj();
//                    }
//                }
//            }
//            return single;
//        }
//
//        public static void reset(){
//            single = null;
//            log.info("reset success");
//        }
//    }
//}
